﻿//#define _CRT_SECURE_NO_WARNINGS 1
//#include<ctype.h>
//#include<malloc.h> /* malloc()等 */
//#include<stdio.h> 
//#include<stdlib.h>
//#include<process.h> /* exit() */
//#define TRUE 1
//#define FALSE 0
//#define OK 1
//#define ERROR 0
//#define OVERFLOW -2
//typedef int Status; /* Status是函数的类型,其值是函数结果状态代码，如OK等 */
//typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
//typedef int SElemType; /* 定义栈元素类型，此句要在c3-1.h的前面 */
///* 栈的顺序存储表示 */
//#define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */
//#define STACK_INCREMENT 2 /* 存储空间分配增量 */
//typedef struct SqStack
//{
//    SElemType* base; /* 在栈构造之前和销毁之后，base的值为NULL */
//    SElemType* top; /* 栈顶指针 */
//    int stacksize; /* 当前已分配的存储空间，以元素为单位 */
//}SqStack; /* 顺序栈 */
//
///*  顺序栈的基本操作(9个) */
//void InitStack(SqStack* S)
//{ /* 构造一个空栈S */
//    (*S).base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
//    if (!(*S).base)
//        exit(OVERFLOW); /* 存储分配失败 */
//    (*S).top = (*S).base;
//    (*S).stacksize = STACK_INIT_SIZE;
//}
//
//void DestroyStack(SqStack* S)
//{ /* 销毁栈S，S不再存在 */
//    free((*S).base);
//    (*S).base = NULL;
//    (*S).top = NULL;
//    (*S).stacksize = 0;
//}
//
//void ClearStack(SqStack* S)
//{ /* 把S置为空栈 */
//    (*S).top = (*S).base;
//}
//
//Status StackEmpty(SqStack S)
//{ /* 若栈S为空栈，则返回TRUE，否则返回FALSE */
//    if (S.top == S.base)
//        return TRUE;
//    else
//        return FALSE;
//}
//
//int StackLength(SqStack S)
//{ /* 返回S的元素个数，即栈的长度 */
//    return S.top - S.base;
//}
//
//Status GetTop(SqStack S, SElemType* e)
//{ /* 若栈不空，则用e返回S的栈顶元素，并返回OK；否则返回ERROR */
//    if (S.top > S.base)
//    {
//        *e = *(S.top - 1);
//        return OK;
//    }
//    else
//        return ERROR;
//}
//
///* 补充Push函数 */
//void Push(SqStack* S, SElemType e)
//{ /* 插入元素e为新的栈顶元素 */
//    if (S->top - S->base >= S->stacksize) { // 栈满，追加存储空间
//        S->base = (SElemType*)realloc(S->base, (S->stacksize + STACK_INCREMENT) * sizeof(SElemType));
//        if (!S->base) exit(OVERFLOW); // 存储分配失败
//        S->top = S->base + S->stacksize;
//        S->stacksize += STACK_INCREMENT;
//    }
//    *(S->top) = e;
//    S->top++;
//}
//
///* 补充Pop函数 */
//Status Pop(SqStack* S, SElemType* e)
//{ /* 若栈不空，则删除S的栈顶元素，用e返回其值，并返回OK；否则返回ERROR */
//    if (S->top == S->base) return ERROR; // 栈空
//    S->top--;
//    *e = *(S->top);
//    return OK;
//}
//
//void StackTraverse(SqStack S, void(*visit)(SElemType))
//{ /* 从栈底到栈顶依次对栈中每个元素调用函数visit() */
//    SElemType* p = S.base;
//    while (p < S.top) {
//        visit(*p);
//        p++;
//    }
//    printf("\n");
//}
//
//void print(SElemType c)
//{
//    printf("%d ", c);
//}
//
//// 新增：十进制转B进制函数
//void decToB(int num, int B) {
//    if (num == 0) {
//        printf("0\n");
//        return;
//    }
//
//    SqStack s;
//    InitStack(&s);
//
//    // 处理负数（题目要求非负十进制整数，此部分可省略）
//    int isNegative = 0;
//    if (num < 0) {
//        isNegative = 1;
//        num = -num;
//    }
//
//    // 转换过程
//    while (num > 0) {
//        Push(&s, num % B);
//        num /= B;
//    }
//
//    // 输出符号
//    if (isNegative) printf("-");
//
//    // 输出转换结果
//    SElemType e;
//    while (!StackEmpty(s)) {
//        Pop(&s, &e);
//        if (e < 10) printf("%d", e);
//        else printf("%c", 'A' + e - 10); // 处理16进制中的A-F
//    }
//    printf("\n");
//
//    DestroyStack(&s);
//}
//
//int main()
//{
//    /*int j;
//    SqStack s;
//    SElemType e;*/
//
//    //// 原测试代码
//    //InitStack(&s);
//    //for (j = 1; j <= 12; j++)
//    //    Push(&s, j);
//    //printf("栈中元素依次为：");
//    //StackTraverse(s, print);
//    //Pop(&s, &e);
//    //printf("弹出的栈顶元素 e=%d\n", e);
//    //printf("栈空否：%d(1:空 0:否)\n", StackEmpty(s));
//    //GetTop(s, &e);
//    //printf("栈顶元素 e=%d 栈的长度为%d\n", e, StackLength(s));
//    //ClearStack(&s);
//    //printf("清空栈后，栈空否：%d(1:空 0:否)\n", StackEmpty(s));
//    //DestroyStack(&s);
//    //printf("销毁栈后，s.top=%p s.base=%p s.stacksize=%d\n", s.top, s.base, s.stacksize);
//
//    // 新增测试：十进制转B进制
//    printf("十进制转B进制测试：\n");
//    int decimal, base;
//    printf("请输入一个非负十进制整数：");
//    scanf("%d", &decimal);
//
//    printf("请输入目标进制(B=2/8/16)：");
//    scanf("%d", &base);
//
//    printf("%d转换为%d进制是：", decimal, base);
//    decToB(decimal, base);
//
//    return 0;
//}
//
////int main()
////{
////    SqStack s;
////
////    // 初始化栈
////    InitStack(&s);
////    printf("栈初始化成功，初始容量: %d\n", s.stacksize);
////
////    // 测试Push函数
////    printf("\n开始测试Push函数：\n");
////    for (int i = 1; i <= 15; i++) {
////        Push(&s, i * 10);
////        printf("插入元素 %d 后：", i * 10);
////        printf("栈长度=%d, 栈容量=%d\n", StackLength(s), s.stacksize);
////    }
////
////    // 遍历栈中元素
////    printf("\n栈中所有元素（从栈底到栈顶）：");
////    StackTraverse(s, print);
////
////    // 销毁栈
////    DestroyStack(&s);
////    printf("\n栈已销毁\n");
////
////    return 0;
////}
//
////int main()
////{
////    SqStack s;
////    SElemType e;
////
////    // 初始化栈并插入测试数据
////    InitStack(&s);
////    printf("栈初始化成功\n");
////
////    printf("\n插入测试数据：\n");
////    for (int i = 1; i <= 5; i++) {
////        Push(&s, i * 10);
////        printf("插入元素 %d\n", i * 10);
////    }
////
////    // 测试Pop函数
////    printf("\n开始测试Pop函数：\n");
////    while (!StackEmpty(s)) {
////        Pop(&s, &e);
////        printf("弹出元素：%d，剩余元素数量：%d\n", e, StackLength(s));
////    }
////
////    // 测试栈空时Pop
////    printf("\n测试栈空时Pop：\n");
////    Status result = Pop(&s, &e);
////    if (result == ERROR) {
////        printf("栈空时Pop返回ERROR，操作失败\n");
////    }
////    else {
////        printf("错误：栈空时Pop应返回ERROR\n");
////    }
////
////    // 销毁栈
////    DestroyStack(&s);
////    printf("\n栈已销毁\n");
////
////    return 0;
////}
//
////int main()
////{
////    printf("==== 进制转换算法测试 ====\n");
////
////    // 测试用例1：255转16进制（结果应为FF）
////    int decimal = 255;
////    int base = 16;
////    printf("测试1: %d → %d进制\n", decimal, base);
////    printf("预期结果: FF\n");
////    printf("实际结果: ");
////    decToB(decimal, base);
////
////    // 测试用例2：1024转2进制（结果应为10000000000）
////    decimal = 1024;
////    base = 2;
////    printf("\n测试2: %d → %d进制\n", decimal, base);
////    printf("预期结果: 10000000000\n");
////    printf("实际结果: ");
////    decToB(decimal, base);
////
////    // 测试用例3：0转8进制（结果应为0）
////    decimal = 0;
////    base = 8;
////    printf("\n测试3: %d → %d进制\n", decimal, base);
////    printf("预期结果: 0\n");
////    printf("实际结果: ");
////    decToB(decimal, base);
////
////    // 测试用例4：交互式输入
////    printf("\n==== 自定义测试 ====\n");
////    printf("请输入一个非负十进制整数: ");
////    scanf("%d", &decimal);
////    printf("请输入目标进制 (2/8/16): ");
////    scanf("%d", &base);
////    printf("%d转换为%d进制结果: ", decimal, base);
////    decToB(decimal, base);
////
////    return 0;
////}